<?php

/*
 * 生成数
 */
class Tree {
	
	//生成树需要的二维数组，必须提供id,fid两个字段
	private $list = array();
	
	//生成的tree数组
	private $tree = array();
	
	public function __construct($list)
	{
		log_message('debug', '成功加载树类');
	}
	
	/*
	 * 提供生成树需要的二维数组，必须提供id,fid两个字段
	 */
	public function set($list)
	{
		if ( ! is_array($list))
		{
			log_message('error', '生成树提供的不是一个数组');
			show_error('生成树提供的不是一个数组');
		}
	
		$new_list = array();
		
		foreach ($list as $data)
		{
			if ( ! isset($data['id']) || ! isset($data['fid']))
			{
				log_message('error', '生成树提供的数组中必须包含id和fid字段');
				show_error('生成树提供的数组中必须包含id和fid字段');
			}
			$new_list[$data['id']] = $data;
		}
		
		$this->list = $new_list;
	}

	/*
	 * 返回根为id的数结果
	 * $id	根节点id
	 */
	public function get($id = 0)
	{
		$this->tree = array();
		return $this->set_tree($id);
	}
	
	/*
	 * 得到子级数组
	 */
	protected function get_child($id)
	{	
		$child = array();
		foreach ($this->list as $row)
		{
			if($row['fid']==$id)
			{
				$child[$row['id']] = $row;
			}
		}
		return $child;
	}
	
	/*
	 * $id为树根id。返回树形数组，多个level字段（层级别，从1开始，1、2、3……，可根据此字段调出样式）
	 */
	protected function set_tree($id = 0, $level = 1)
	{
		$child = $this->get_child($id);
		
		if ($child===FALSE)
		{
			return FALSE;
		}
		elseif ( ! $child)
		{
			return array();
		}
		
		foreach ($child as $id => $data)
		{
			$data['level'] = $level;
			$this->tree[$id] = $data;
			$this->set_tree($id, $level+1);
		}
		
		return $this->tree;
	}

}